package com.ncst.backend.controller;

import com.ncst.backend.common.Result;
import com.ncst.backend.util.CaptchaUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.web.bind.annotation.*;
import com.ncst.backend.service.AdminService;
import com.ncst.backend.domain.Admin;
import org.springframework.beans.factory.annotation.Autowired;

import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * 认证控制器
 * 提供：验证码获取、注册、登录 功能。
 * 注意：
 * 1) 为便于联调，示例使用内存 Map 保存用户，实际应替换为数据库持久化；
 * 2) 密码使用 BCrypt 加密存储，登录时校验；
 * 3) 验证码通过 HttpSession 保存，一次性使用；
 * 4) 统一返回使用 Result<T>。
 */
@Api(tags = "认证与登录")
@Slf4j
@RestController
@RequestMapping("/auth")
public class AuthController {

    private static final String SESSION_CAPTCHA_PREFIX = "CAPTCHA_";
    // 注入管理员服务
    @Autowired
    private AdminService adminService;
    // BCrypt 加密器（线程安全，可复用）
    private static final BCryptPasswordEncoder ENCODER = new BCryptPasswordEncoder();

    @ApiOperation("获取验证码")
    @GetMapping("/captcha")
    public Result<Map<String, Object>> captcha(HttpSession session) {
        String text = CaptchaUtil.generateCaptchaText();
        String imageBase64 = CaptchaUtil.generateCaptchaImage(text);
        String key = UUID.randomUUID().toString();
        session.setAttribute(SESSION_CAPTCHA_PREFIX + key, text.toLowerCase());
        Map<String, Object> body = new HashMap<>();
        body.put("key", key);
        body.put("image", imageBase64);
        return Result.success(body);
    }

    @ApiOperation("登录")
@PostMapping("/login")
public Result<Map<String, Object>> login(@RequestBody LoginReq req, HttpSession session) {
    if (!validCaptcha(req.getKey(), req.getCaptcha(), session)) {
        return Result.badRequest("验证码错误或已过期");
    }
    if (req.getUsername() == null || req.getUsername().isEmpty() || req.getPassword() == null || req.getPassword().isEmpty()) {
        return Result.badRequest("账号或密码不能为空");
    }
    Admin admin = adminService.findByCode(req.getUsername());
    if (admin == null || !ENCODER.matches(req.getPassword(), admin.getPassword())) {
        return Result.error(401, "账号或密码错误");
    }
    Map<String, Object> data = new HashMap<>();
    data.put("token", UUID.randomUUID().toString());
    data.put("username", req.getUsername());
    data.put("role", admin.getRole()); // 新增：返回身份
    return Result.success("登录成功", data);
}

    @ApiOperation("注册")
@PostMapping("/register")
public Result<Void> register(@RequestBody RegisterReq req, HttpSession session) {
    if (!validCaptcha(req.getKey(), req.getCaptcha(), session)) {
        return Result.badRequest("验证码错误或已过期");
    }
    if (req.getUsername() == null || req.getUsername().isEmpty()) {
        return Result.badRequest("账号不能为空");
    }
    if (req.getPassword() == null || req.getPassword().length() < 6) {
        return Result.badRequest("密码至少6位");
    }
    if (req.getRole() == null || req.getRole().isEmpty()) { // 新增
        return Result.badRequest("请选择身份");
    }
    if (adminService.findByCode(req.getUsername()) != null) {
        return Result.badRequest("该账号已存在");
    }
    Admin admin = new Admin();
    admin.setAdminCode(req.getUsername());
    admin.setPassword(ENCODER.encode(req.getPassword()));
    admin.setRole(req.getRole()); // 新增
    boolean ok = adminService.create(admin);
    if (!ok) {
        return Result.error("注册失败");
    }
    return Result.success("注册成功");
}

    @ApiOperation("退出登录")
    @PostMapping("/logout")
    public Result<Void> logout(HttpSession session) {
        try {
            session.invalidate();
        } catch (Exception ignored) {}
        return Result.success("退出成功");
    }

    /**
     * 校验验证码并一次性移除
     */
    private boolean validCaptcha(String key, String input, HttpSession session) {
        if (key == null || input == null) return false;
        Object real = session.getAttribute(SESSION_CAPTCHA_PREFIX + key);
        session.removeAttribute(SESSION_CAPTCHA_PREFIX + key); // 一次性
        return real != null && input.toLowerCase().equals(real.toString());
    }

    @Data
    public static class LoginReq {
        /** 用户名 */
        private String username;
        /** 明文密码（传输层应使用 HTTPS；服务端仅做匹配） */
        private String password;
        /** 图形验证码内容 */
        private String captcha;
        /** 获取验证码时返回的键 */
        private String key;
    }

    @Data
    public static class RegisterReq {
        /** 用户名 */
        private String username;
        /** 明文密码（服务端将进行 BCrypt 加密后保存） */
        private String password;
        /** 图形验证码内容 */
        private String captcha;
        /** 获取验证码时返回的键 */
        private String key;
    /** 身份（病人/医生/管理员） */ // 新增
    private String role; // 新增
    }
}
